package com.rybbaby.tss.platform.tags;

import java.io.IOException;
import java.text.MessageFormat;
import java.util.List;
import java.util.Map;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;

import com.rybbaby.tss.core.utils.SpringApplicationContextUtil;
import com.rybbaby.tss.platform.sysFiles.entity.SysFiles;
import com.rybbaby.tss.platform.sysFiles.service.ISysFilesService;
import freemarker.template.*;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import freemarker.core.Environment;

/**
 * @description 根据图片文件id获取图片信息标签,同时实现jsp和freemarker模板
 * 
 * @author 谢进伟
 * 
 * @createDate 2016年11月20日 下午9:37:59
 */
public class SysFilesTag extends SimpleTagSupport implements TemplateDirectiveModel {
	
	@Autowired
	private ISysFilesService sysFilesService;
	private static String sql = "SELECT id,fileName,relativePath,sizes,type,qiniuKey,qiniuHash FROM sys_files WHERE id IN({0})";
	
	/*************************************** 针对freemarker视图的标签实现 ***************************************************/
	@Override
	public void execute(Environment env , Map params , TemplateModel [] loopVars , TemplateDirectiveBody body) throws TemplateException , IOException {
		try {
			String fileIdsStr = "" , // 文件id字符串,多个id用第二个参数隔开
			separator = ",";// 分隔符,默认为逗号
			Object paramValue = params.get("fileIds");
			if(paramValue instanceof TemplateScalarModel) {
				fileIdsStr = ((TemplateScalarModel)paramValue).getAsString();
			}
			paramValue = params.get("separator");
			if(paramValue instanceof TemplateScalarModel) {
				separator = ((TemplateScalarModel)paramValue).getAsString();
			}
			separator = StringUtils.isBlank(separator) ? "," : separator;// 默认为逗号
			if(StringUtils.isNotBlank(fileIdsStr)) {
				List<SysFiles> list = getFileList(fileIdsStr , separator);
				if(body != null) {
					loopVars[0] = Configuration.getDefaultObjectWrapper(Configuration.getVersion()).wrap(list);
					body.render(env.getOut());
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 获取文件列表
	 * 
	 * @param fileIdsStr
	 *            文件id字符串
	 * @param separator
	 *            分隔符
	 * @return
	 * @throws Exception
	 */
	private List<SysFiles> getFileList(String fileIdsStr , String separator) throws Exception {
		String [] fileIdsSplit = fileIdsStr.split(separator);
		String fileIds = StringUtils.join(fileIdsSplit , "','");
		String format = MessageFormat.format(sql , "'" + fileIds + "'");
		if(this.sysFilesService == null) {// 用jsp标签的时候,无法自动注入,手动的去spring容器中拿
			this.sysFilesService = SpringApplicationContextUtil.getContext().getBean(ISysFilesService.class);
		}
		List<SysFiles> list = this.sysFilesService.findListBySql(format , new Object []{ });
		return list;
	}
	
	/*************************************** 针对jsp视图使的标签实现 ***************************************************/
	/** 文件id字符串 **/
	private String fileIds;
	/** 多个文件Id之间的分隔符,默认:逗号(,) **/
	private String separator;
	/** 文件输出的变量名字 **/
	private String var;
	
	private void init() {
		if(StringUtils.isBlank(getFileIds())) {
			setFileIds("");
		}
		if(StringUtils.isBlank(getSeparator())) {
			setSeparator(",");
		}
	}
	
	@Override
	public void doTag() throws JspException , IOException {
		try {
			init();
			List<SysFiles> fileList = getFileList(fileIds , separator);
			for(SysFiles sysFiles : fileList) {// 循环输出文件对象
				this.getJspContext().setAttribute(var , sysFiles , PageContext.PAGE_SCOPE);
				this.getJspBody().invoke(null);
			}
			this.getJspContext().removeAttribute(var);// 移除页面的临时变量,防止变量污染
		} catch (Exception e) {
			e.printStackTrace();
		}
		super.doTag();
	}
	
	public String getFileIds() {
		return fileIds;
	}
	
	public void setFileIds(String fileIds) {
		this.fileIds = fileIds;
	}
	
	public String getSeparator() {
		return separator;
	}
	
	public void setSeparator(String separator) {
		this.separator = separator;
	}
	
	public String getVar() {
		return var;
	}
	
	public void setVar(String var) {
		this.var = var;
	}
	
}
